﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ToolUltity;
using System.Data;
using BusinessLibary;
using DevExpress.Utils;
using System.Collections;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using EntityLibrary;

namespace IMedicare
{
    public class SDRZDRInterface : IMedicare
    {
        public SDRZDRInterface()
        {
            log = LogService.Createinstance("SystemManage");
            rationInhosRegFacade = new IRalationInHosRegFacade();
            rationInhosRegFacade = new IRalationInHosRegFacade();
            miitemRelationYbFacade = new MIItemRelationYPFacade();
            miitemRelationZLFacade = new MIItemRelationZLFacade();
            ybYpMLFacade = new YBYPInfoFacade();
            ybZLXMFacade = new YBZLInfoFacade();
            chargeItemInfoFacade = new ChargeItemInfoFacade();
        }
        #region IMedicare 成员

        public int InitHisDLL(System.Collections.ArrayList PrenoList)
        {
            log.Info("base初始化函数成功，执行日照社保接口的初始化函数。");
            StringBuilder st = new StringBuilder(1024);
            try
            {
                retint = YbFun.INIT(st);
            }
            catch (Exception e)
            {

                log.Info(e.Message);
            }

            if (retint != 0)
            {
                //errmsg = "医保函数初始化失败！";
                //MessageBox.Show(errmsg);
                log.Error(errmsg);
                return -1;
            }
            log.Info("执行医保的初始化函数成功。");
            //执行签到操作
            InitPara();
            ybpara.BusinessCode = "9100";
            ybpara.SenderSerialNo = FormateSenderSerialNo();
            ybpara.InputStr = FormateInputString();
            log.Info("签到输入的参数为" + ybpara.InputStr.ToString());
            retint = YbFun.BUSINESS_HANDLE(ybpara.InputStr, ybpara.OutputStr);
            log.Info("签到输出的参数为" + ybpara.OutputStr.ToString());
            if (retint != 0)
            {
                errmsg = "执行医保签到失败！";
                log.Error(errmsg);
                MessageBox.Show(errmsg);
                return -1;
            }
            #region 获取本次签到的业务周期号
            businessSerialNo = ybpara.OutputStr.ToString().Split('^')[2].ToString().Trim().Split('|')[0];//获取业务周期号
            #endregion

            log.Info("签到成功！");
            return 0;
        }

        public int FreeHisDLL(System.Collections.ArrayList PrenoList)
        {
            //执行签退操作
            InitPara();
            ybpara.BusinessCode = "9110";
            ybpara.SenderSerialNo = FormateSenderSerialNo();
            ybpara.InputStr = FormateInputString();
            log.Info("签退输入的参数为" + ybpara.InputStr.ToString());
            retint = YbFun.BUSINESS_HANDLE(ybpara.InputStr, ybpara.OutputStr);
            if (retint != 0)
            {
                errmsg = "执行医保签退失败！";
                log.Error(errmsg);
                MessageBox.Show(errmsg);
                return -1;
            }
            businessSerialNo = string.Empty;
            log.Info("签退成功！");
            return 0;
        }

        public int ReadCard(int TranType, string PersonID, ref System.Data.DataSet patientInfoData, ref System.Collections.ArrayList PrenoList)
        {

            InitPara();
            ybpara.BusinessCode = "2000";//读卡操作 交易码2100
            ybpara.SenderSerialNo = FormateSenderSerialNo();//获得交易流水号
            ybpara.InputStr = FormateInputString();

            log.Info("执行医保DLL初始化函数！");
            log.Info("医保初始化输入参数为" + ybpara.InputStr.ToString());
            int i = YbFun.BUSINESS_HANDLE(ybpara.InputStr, ybpara.OutputStr);
            log.Info("医保初始化输出参数为" + ybpara.OutputStr.ToString());
            if (i != 0)
            {
                errmsg = "执行医保读卡操作失败！详细信息：" + ybpara.OutputStr.ToString();
                OutPutErrmsg(errmsg, ref PrenoList);
                return -1;
            }
            log.Info("医保读卡成功！");

            PrenoList.Clear();
            PrenoList.Add(ybpara.OutputStr.ToString());

            return 0;

        }

        public int Register(int TranType, string PersonID, System.Data.DataSet registerInfoData, ref System.Collections.ArrayList PrenoList)
        {
            throw new NotImplementedException();
        }

        public int ClinicBalance(int TranType, System.Data.DataSet detailAccountData, System.Data.DataSet ecipeMedicineData, ref System.Collections.ArrayList PrenoList)
        {
            throw new NotImplementedException();
        }

        public int InHosRegister(int TranType, int InHosState, string InHosID, int CurrentInHosMark, System.Data.DataSet inHosRecordData, System.Data.DataSet leaveHosRecordData, ref System.Collections.ArrayList PrenoList)
        {
            #region 入院登记
            if (TranType == 1)
            {
                string medType = "21";
                FrmSelectType selectType = new FrmSelectType();
                if (DialogResult.OK == selectType.ShowDialog())
                {
                    medType = selectType.MedType;
                }

                string InhosRegisterNo = FormateInhosSerialNo();//住院流水号
                log.Info("住院号为：" + InhosRegisterNo);
                //inHosRecordData.WriteXml("C://a.xml");





                InitPara();
                ybpara.BusinessCode = "2210";//门诊住院登记交易码
                ybpara.SenderSerialNo = FormateSenderSerialNo();//获得交易流水号

                #region 住院登记的输入参数
                StringBuilder stb = new StringBuilder(1024);
                /*输入参数
                编号	说明	类型	约束	备注
                1	门诊/住院流水号	VARCHAR2(18)	NOT NULL	唯一
                2	医疗类别	VARCHAR2(3)	NOT NULL	AKA130，参见附件
                3	挂号日期	VARCHAR2(14)	NOT NULL 	YYYYMMDDHH24MISS
                4	诊断疾病编码	VARCHAR2(20)		必须为中心病种编码
                5	诊断疾病名称	VARCHAR2(50)		
                6	病历信息	VARCHAR2(100)		
                7	科室名称	VARCHAR2(50)		
                8	床位号	VARCHAR2(20)		住院类需要传入床位号，如果入院时没有分配床位号，可以通过调用住院信息修改交易录入床位号
                9	医生代码	VARCHAR2(20)		
                10	医生姓名	VARCHAR2(20)		
                11	挂号费	VARCHAR2(8)		2位小数  只对门诊有用，如要的话传入，否则传0         
                12	检查费	VARCHAR2(8)		2位小数  只对门诊有用，如要的话传入，否则传0
                13	经办人	VARCHAR2(20)	NOT NULL	医疗机构操作员姓名
                14	备用01	VARCHAR2(10)		
                15	备用02	VARCHAR2(10)		
                16	备用03	VARCHAR2(10)		
                */
                stb.Append(InhosRegisterNo);//1流水号
                stb.Append("|");
                stb.Append(medType);//普通住院
                stb.Append("|");
                stb.Append(serverTime.ToString("yyyyMMddHHmmss"));//挂号日期
                stb.Append("|");
                stb.Append("1005838");//中心病种编码
                stb.Append("|");
                stb.Append("手术后对症治疗");//诊断疾病名称
                stb.Append("|");
                stb.Append("");//病历信息
                stb.Append("|");
                stb.Append(inHosRecordData.Tables[0].Rows[0]["OFFICEID"].ToString());//科室名称
                stb.Append("|");
                stb.Append(inHosRecordData.Tables[0].Rows[0]["BEDID"].ToString());//床位号
                stb.Append("|");
                stb.Append(inHosRecordData.Tables[0].Rows[0]["DOCTORID"].ToString());//医生代码
                stb.Append("|");
                stb.Append("");//医生姓名
                stb.Append("|");
                stb.Append("");//挂号费
                stb.Append("|");
                stb.Append("");//检查费
                stb.Append("|");
                stb.Append(operatorName);//操作员姓名
                stb.Append("|");
                stb.Append("");//备用
                stb.Append("|");
                stb.Append("");//备用
                stb.Append("|");
                stb.Append("");//备用
                stb.Append("|");
                #endregion
                ybpara.InputInnerStr = stb;
                ybpara.InputStr = FormateInputString();
                log.Info("住院登记输入的参数为" + ybpara.InputStr.ToString());
                retint = YbFun.BUSINESS_HANDLE(ybpara.InputStr, ybpara.OutputStr);
                log.Info("住院登记输出的参数为" + ybpara.OutputStr.ToString());
                if (retint != 0)
                {

                    errmsg = "住院登记失败，原因：" + ybpara.OutputStr.ToString();
                    OutPutErrmsg(errmsg, ref PrenoList);
                    return -1;
                }



                log.Info("插入登记关系表，保存住院流水号，住院号");
                IRalationInHosRegData data = new IRalationInHosRegData();
                DataRow row = data.Tables[0].NewRow();
                row.BeginEdit();
                row["INHOSFLOWNO"] = InhosRegisterNo;
                row["INHOSID"] = inHosRecordData.Tables[0].Rows[0]["INHOSID"];
                row["MEDTYPE"] = "01"; //保存医疗类别，目的是供要修改住院登记信息时调用。
                row["FLAG"] = "0";//保存结算状态 0 未结算 1预结算 2 正式结算
                row["REMARK"] = ybpara.SenderSerialNo;//发送方交易流水号
                row["TRANDT"] = serverTime;//发送方交易流水号
                row["MEDICARENO"] = inHosRecordData.Tables[0].Rows[0]["MEDICARENO"];
                row["IDCARDNO"] = inHosRecordData.Tables[0].Rows[0]["IDCARDNO"];//身份证号
                row["PRE0"] = "";
                row["PRE1"] = "";
                row["PRE2"] = "";
                row["PRE3"] = "";
                row["PRE4"] = "";
                row["PRE5"] = "";
                row["PRE6"] = "";
                row["PRE7"] = "";
                row["PRE8"] = "";
                row["PRE9"] = "";
                row["PRE10"] = "";
                row["PRE11"] = "";
                row["PRE12"] = "";
                row["PRE13"] = "";
                row["PRE14"] = "";
                row["PRE15"] = "";
                row["OUTPUTSTR"] = "";
                row["MEDCLASS"] = medType;//登记的医疗类别
                row["POSDATE"] = "";
                row["POSMONEY"] = "";
                row["CASHMONEY"] = "";
                row["POSFLOWNO"] = "";


                row.EndEdit();
                data.Tables[0].Rows.Add(row);
                if (!UpdateRalationData(data, 0))
                {
                    errmsg = "插入医院医保关系表失败";
                    OutPutErrmsg(errmsg, ref PrenoList);
                    return -1;
                }



                log.Info("入院登记成功");

            }
            #endregion

            #region 登记取消

            if (TranType == -1)
            {
                DataRow row = GetInhosRegInfo(InHosID);
                string RegisterNo = row["REMARK"].ToString();//获取住院登记时医疗机构的交易流水号
                if (!RegisterCancel(RegisterNo, operatorName))
                {
                    return -1;
                }
                log.Info("医保中心住院撤销成功");
                log.Info("删除医保中心住院登记对应的关系表");
                IRalationInHosRegData ralationInhos = new IRalationInHosRegData();
                DataRow rowDel = ralationInhos.Tables[0].NewRow();
                rowDel["INHOSFLOWNO"] = row["INHOSFLOWNO"];
                rowDel["INHOSID"] = row["INHOSID"];
                rowDel["MEDTYPE"] = row["MEDTYPE"];
                ralationInhos.Tables[0].Rows.Add(rowDel);
                if (!UpdateRalationData(ralationInhos, 1))
                {
                    log.Error("HIS删除医保对应关系表失败！I_RATIONINHOSREG");
                    //MsgWarning("HI删除医保对应关系表失败，请联系操作员进行手工删除！");
                    //ralationInhos.WriteXml(serverTime.ToString() + "I_RATIONINHOSREG.xml");

                }

                log.Info("入院登记取消成功");

            }
            #endregion
            return 0;
        }

        public int InHosCharge(int TranType, int InHosState, string PersonID, string InHosID, int CurrentInHosMark, System.Data.DataSet inHosRecordData, System.Data.DataSet inHosChargeDetailData, System.Data.DataSet inHosLeechdomRecordData, ref System.Collections.ArrayList PrenoList)
        {

            DataRow rowInhosRegis = GetInhosRegInfo(InHosID);
            if (rowInhosRegis == null)
            {
                MessageBox.Show("没有找到该病人相应的医保登记信息！");
                return -1;
            }
            string inhosFlowNo = rowInhosRegis["INHOSFLOWNO"].ToString();//获取与住院登记的医保中心对应的住院号

            WaitDialogForm wdialog = new WaitDialogForm("正在上传住院号为：" + InHosID + "的明细！请稍候……"); //等侍窗体定义

            string isUpload = rowInhosRegis["MEDTYPE"].ToString().Substring(0, 1);
            if (isUpload.Equals("1"))
            {
                MessageBox.Show("该病人处方已经上传！");
                return -1;
            }
            string upDownTime = rowInhosRegis["MEDTYPE"].ToString().Substring(1);//上传的处方次数

            log.Info("第" + upDownTime + "次上传处方");

            #region 上传处方明细

            ArrayList list = new ArrayList();//此list保存已经成功上传的处方号
            #region 上传处方明细函数的参数
            /*
				 * 编号	名称								长度					约束			说明
					1		住院流水号(门诊流水号)	VARCHAR2(18)	NOT NULL	同登记时的住院流水号（门诊流水号）
					2		项目类别	VARCHAR2(3)							NOT NULL	1药品、2诊疗项目、3服务设施
					3		费用类别	VARCHAR2(3)	NOT NULL							11西药、12中成药、13中草药、21检查费、22特殊检查费、23输氧费、24手术费、25化验费、26输血费、27诊查费 、31治疗费、32特殊治疗费、33护理费、91其他费用、92挂号费、93特殊材料费、94材料费、34床位费
					4		处方号	VARCHAR2(20)	NOT NULL	
					5		处方日期	VARCHAR2(14)	NOT NULL	YYYYMMDDHH24MISS
					6		医院收费项目内码	VARCHAR2(20)	NOT NULL	
					7		收费项目中心编码	VARCHAR2(20)	NOT NULL	中心编号
					8		医院收费项目名称	VARCHAR2(50)	NOT NULL	
					9		单价	VARCHAR2(12)	NOT NULL	4位小数
					10		数量	VARCHAR2(12)	NOT NULL	2位小数
					11		剂型	VARCHAR2(20)		
					12		规格	VARCHAR2(100)		
					13		每次用量	VARCHAR2(12)		2位小数
					14		使用频次	VARCHAR2(20)		
					15		医生姓名	VARCHAR2(20)		传处方医师姓名
					16		处方医师	VARCHAR2(20)		传处方医师编码
					17		用法	VARCHAR2(100)		
					18		单位	VARCHAR2(20)		
					19		科别名称	VARCHAR2(20)		
					20		执行天数	VARCHAR2(4)		
					21		草药单复方标志	VARCHAR2(3)		0单方，1复方
					22		经办人	VARCHAR2(20)		医疗机构操作员姓名
                    23		备用01	VARCHAR2(10)		指定自费标志
                    24		备用02	VARCHAR2(10)		
                    25		备用03	VARCHAR2(10)		

				 * */
            #endregion

            #region 保留



            //#region 诊疗项目的明细上传
            //string xmlb = string.Empty;//项目类别
            //string fylb = string.Empty;//费用类别
            //string xmybbm = string.Empty;//项目中心编码

            //foreach (DataRow row in inHosChargeDetailData.Tables[0].Rows)
            //{
            //    if (row["ITEMID"].ToString().Trim() == "01" || row["ITEMID"].ToString().Trim() == "02" || row["ITEMID"].ToString().Trim() == "03")
            //    {
            //        continue;
            //    }

            //    DataRow centerItem = GetCenteritem(row["ITEMID"].ToString());//收费项目中心编码

            //    if (centerItem == null || centerItem["ITEMIDMED"].ToString().Trim().Equals(string.Empty))
            //    {
            //        log.Info(row["ITEMID"].ToString() + "与医保数据中心没有对应的项目");
            //        xmlb = centerItem["PRE1"].ToString();
            //        fylb = "91";
            //        xmybbm = "AAAAA";

            //    }
            //    else
            //    {
            //        xmlb = centerItem["PRE1"].ToString();
            //        fylb = GetZLByItem(centerItem["ITEMIDMED"].ToString())["SFLB"].ToString();
            //        xmybbm = centerItem["ITEMIDMED"].ToString();
            //    }


            //    StringBuilder s = new StringBuilder(1024);

            //    s.Append(inhosFlowNo);//同门诊登记时的流水号。 程序生成
            //    s.Append("|");
            //    //普通诊疗项目
            //    s.Append(xmlb);//项目类别
            //    s.Append("|");
            //    s.Append(fylb);//费用类别
            //    s.Append("|");
            //    s.Append(row["DETAILACCOUNTID"].ToString() + upDownTime);//处方号 即对应了 发票号
            //    s.Append("|");
            //    s.Append(serverTime.ToString("yyyyMMddHHmmss"));//处方日期
            //    s.Append("|");
            //    s.Append(row["ITEMID"].ToString());//医院收费项目内码
            //    s.Append("|");
            //    s.Append(xmybbm);//收费项目中心编码  
            //    s.Append("|");
            //    s.Append(row["CHARGEITEM"].ToString());//医院收费项目名称
            //    s.Append("|");
            //    s.Append(row["UNITPRICE"].ToString());//单价
            //    s.Append("|");
            //    s.Append(row["AMOUNT"].ToString());//数量
            //    s.Append("|");
            //    s.Append("");//剂型
            //    s.Append("|");
            //    s.Append("");//规格
            //    s.Append("|");
            //    s.Append("");//每次用量
            //    s.Append("|");
            //    s.Append("");//使用频次
            //    s.Append("|");
            //    s.Append("");//医师姓名
            //    s.Append("|");
            //    s.Append("");//处方医师
            //    s.Append("|");
            //    s.Append("");//用法
            //    s.Append("|");
            //    s.Append("");//单位
            //    s.Append("|");
            //    s.Append("");//科别名称
            //    s.Append("|");
            //    s.Append("");//执行天数
            //    s.Append("|");
            //    s.Append("");//草药单复方标志
            //    s.Append("|");
            //    s.Append(operatorName);//经办人
            //    s.Append("|");
            //    s.Append("");//备用1
            //    s.Append("|");
            //    s.Append("");//备用2
            //    s.Append("|");
            //    s.Append("");//备用3
            //    s.Append("|");

            //    //stbInput.Append(s.ToString()+"$");
            //    InitPara();//初始化医保内置函数的变量
            //    ybpara.BusinessCode = "2310";//费用明细上报
            //    ybpara.SenderSerialNo = FormateSenderSerialNo();//获得交易流水号
            //    ybpara.InputInnerStr = s;
            //    ybpara.InputStr = FormateInputString();
            //    log.Info("上传" + row["ITEMID"].ToString() + "明细生成的输入参数" + ybpara.InputStr.ToString());
            //    //执行上传明细
            //    retint = YbFun.BUSINESS_HANDLE(ybpara.InputStr, ybpara.OutputStr);
            //    if (retint != 0)
            //    {
            //        errmsg = "上传" + row["ITEMID"].ToString() + "明细失败！原因：" + ybpara.OutputStr.ToString();
            //        OutPutErrmsg(errmsg, ref PrenoList);
            //        DiagenoseCancel(inhosFlowNo, list, operatorName);//退掉已经传输成功的处方
            //        //RegisterCancel(returnFlowNo,OperatorName);
            //        wdialog.Close();
            //        return -1;
            //    }
            //    list.Add(row["DETAILACCOUNTID"].ToString());//list中保存每次项目上传返回的交易流水号 以供处方上传失败时撤销已经成功上传的处方。
            //    log.Info("上传明细" + row["ITEMID"].ToString() + "成功！");
            //}
            //#endregion


            //#region  药品的明细上传
            //if (inHosLeechdomRecordData.Tables["H_INHOSLEECHDOM_RECORD"].Rows.Count > 0)
            //{
            //    foreach (DataRow row in inHosLeechdomRecordData.Tables["H_INHOSLEECHDOM_RECORD"].Rows)
            //    {
            //        DataRow centerYp = GetCenterYp(row["LEECHDOMNO"].ToString());//医保中心药品对应编码
            //        if (centerYp == null || centerYp["ITEMIDMED"].ToString().Trim().Equals(string.Empty))
            //        {
            //            log.Info(row["LEECHDOMNO"].ToString() + "与医保数据中心没有对应的项目");
            //            xmlb = "1";
            //            fylb = "91";
            //            xmybbm = "AAAAA";

            //        }
            //        else
            //        {
            //            xmlb = "1";
            //            fylb = GetYpByItem(centerYp["ITEMIDMED"].ToString())["SFLB"].ToString();//费用类别
            //            xmybbm = centerYp["ITEMIDMED"].ToString();
            //        }

            //        StringBuilder s = new StringBuilder(1024);
            //        //s.Append(rowRef["DIAGNOSEID"]);//药品的流水号则对应着该明细号的诊疗号、
            //        s.Append(inhosFlowNo);//同门诊登记时的流水号。 程序生成
            //        s.Append("|");

            //        //药品项目
            //        s.Append("1");//项目类别  药品
            //        s.Append("|");


            //        s.Append(fylb);//费用类别
            //        s.Append("|");
            //        s.Append(inHosChargeDetailData.Tables[0].Rows[0]["DETAILACCOUNTID"].ToString() + upDownTime);//处方号 即对应了 发票号
            //        s.Append("|");
            //        s.Append(serverTime.ToString("yyyyMMddHHmmss"));//处方日期
            //        s.Append("|");
            //        s.Append(row["LEECHDOMNO"].ToString());//医院收费项目内码
            //        s.Append("|");
            //        s.Append(xmybbm);//收费项目中心编码  
            //        s.Append("|");
            //        s.Append(row["CURRENCYNAME"].ToString());//医院收费项目名称
            //        s.Append("|");
            //        s.Append(row["UNITPRICE"].ToString());//单价
            //        s.Append("|");
            //        s.Append(row["AMOUNT"].ToString());//数量
            //        s.Append("|");
            //        s.Append("");//剂型
            //        s.Append("|");
            //        s.Append("");//规格
            //        s.Append("|");
            //        s.Append("");//每次用量
            //        s.Append("|");
            //        s.Append("");//使用频次
            //        s.Append("|");
            //        s.Append("");//医师姓名
            //        s.Append("|");
            //        s.Append("");//处方医师
            //        s.Append("|");
            //        s.Append("");//用法
            //        s.Append("|");
            //        s.Append("");//单位
            //        s.Append("|");
            //        s.Append("");//科别名称
            //        s.Append("|");
            //        s.Append("");//执行天数
            //        s.Append("|");
            //        s.Append("");//草药单复方标志
            //        s.Append("|");
            //        s.Append(operatorName);//经办人
            //        s.Append("|");
            //        s.Append("");//备用1
            //        s.Append("|");
            //        s.Append("");//备用2
            //        s.Append("|");
            //        s.Append("");//备用3
            //        s.Append("|");
            //        InitPara();//初始化医保内置函数的变量
            //        ybpara.BusinessCode = "2310";//费用明细上报
            //        ybpara.SenderSerialNo = FormateSenderSerialNo();//获得交易流水号

            //        ybpara.InputInnerStr = s;
            //        ybpara.InputStr = FormateInputString();
            //        log.Info("上传" + row["LEECHDOMNO"].ToString() + "明细生成的输入参数" + ybpara.InputStr.ToString());
            //        //执行上传明细
            //        retint = YbFun.BUSINESS_HANDLE(ybpara.InputStr, ybpara.OutputStr);
            //        if (retint != 0)
            //        {
            //            errmsg = "上传" + row["LEECHDOMNO"].ToString() + "明细失败！原因：" + ybpara.OutputStr.ToString();
            //            OutPutErrmsg(errmsg, ref PrenoList);
            //            DiagenoseCancel(inhosFlowNo, list, operatorName);//退掉已经传输成功的处方
            //            wdialog.Close();
            //            return -1;
            //        }
            //        list.Add(inHosChargeDetailData.Tables[0].Rows[0]["DETAILACCOUNTID"]);//list中保存每次项目上传返回的交易流水号 以供处方上传失败时撤销已经成功上传的处方。
            //        log.Info("上传明细" + row["LEECHDOMNO"].ToString() + "成功！");
            //    }
            //}
            //#endregion

            #endregion
            foreach (DataRow row in inHosChargeDetailData.Tables[0].Rows)
            {

                StringBuilder s = new StringBuilder(1024);

                s.Append(inhosFlowNo);//同门诊登记时的流水号。 程序生成
                s.Append("|");
                //普通诊疗项目
                s.Append(row["项目类别"]);//项目类别
                s.Append("|");
                s.Append(row["费用类别"]);//费用类别
                s.Append("|");
                s.Append(row["医嘱序号"] + upDownTime);//处方号 即对应了 发票号
                s.Append("|");
                s.Append(row["执行时间"]);//处方日期
                s.Append("|");
                s.Append(row["收费项目内码"]);//医院收费项目内码
                s.Append("|");
                s.Append(row["项目中心编码"]);//收费项目中心编码  
                s.Append("|");
                s.Append(row["项目名称"]);//医院收费项目名称
                s.Append("|");
                s.Append(row["单价"]);//单价
                s.Append("|");
                s.Append(row["数量"]);//数量
                s.Append("|");
                s.Append(row["剂型"]);//剂型
                s.Append("|");
                s.Append(row["规格"]);//规格
                s.Append("|");
                s.Append("");//每次用量
                s.Append("|");
                s.Append("");//使用频次
                s.Append("|");
                s.Append("");//医师姓名
                s.Append("|");
                s.Append(row["医生代码"]);//处方医师
                s.Append("|");
                s.Append("");//用法
                s.Append("|");
                s.Append(row["单位"]);//单位
                s.Append("|");
                s.Append("");//科别名称
                s.Append("|");
                s.Append("");//执行天数
                s.Append("|");
                s.Append("");//草药单复方标志
                s.Append("|");
                s.Append(operatorName);//经办人
                s.Append("|");
                s.Append(row["SELFMONEY"]);//备用1
                s.Append("|");
                s.Append("");//备用2
                s.Append("|");
                s.Append("");//备用3
                s.Append("|");

                //stbInput.Append(s.ToString()+"$");
                InitPara();//初始化医保内置函数的变量
                ybpara.BusinessCode = "2310";//费用明细上报
                ybpara.SenderSerialNo = FormateSenderSerialNo();//获得交易流水号
                ybpara.InputInnerStr = s;
                ybpara.InputStr = FormateInputString();
                log.Info("上传" + row["收费项目内码"].ToString() + "明细生成的输入参数" + ybpara.InputStr.ToString());
                //执行上传明细

                retint = YbFun.BUSINESS_HANDLE(ybpara.InputStr, ybpara.OutputStr);
                log.Info("上传" + row["收费项目内码"].ToString() + "明细生成的输出参数" + ybpara.OutputStr.ToString());
                if (retint != 0)
                {
                    errmsg = "上传" + row["收费项目内码"].ToString() + "明细失败！原因：" + ybpara.OutputStr.ToString();
                    OutPutErrmsg(errmsg, ref PrenoList);
                    DiagenoseCancel(inhosFlowNo, list, operatorName);//退掉已经传输成功的处方
                    //RegisterCancel(returnFlowNo,OperatorName);
                    wdialog.Close();
                    return -1;
                }
                list.Add(row["收费项目内码"].ToString());//list中保存每次项目上传返回的交易流水号 以供处方上传失败时撤销已经成功上传的处方。
                log.Info("上传明细" + row["收费项目内码"].ToString() + "成功！");
            }



            #endregion
            wdialog.Close();
            DataSet ds = rationInhosRegFacade.FindByInHosID(InHosID);
            if (ds.Tables[0].Rows.Count > 0)
            {
                if (!ds.Tables[0].Rows[0]["MEDTYPE"].ToString().Trim().Substring(0, 1).Equals("1"))
                {
                    string updownTime = ds.Tables[0].Rows[0]["MEDTYPE"].ToString();
                    ds.Tables[0].Rows[0].BeginEdit();
                    ds.Tables[0].Rows[0]["MEDTYPE"] = "1" + Convert.ToInt32(updownTime.Substring(1)).ToString();  //修改明细上传标志为1 已上传
                    ds.Tables[0].Rows[0].EndEdit();


                    rationInhosRegFacade.updateEntity(ds);
                }
            }
            else
            {
                OutPutErrmsg("找不到该医保病人的入院信息，进行结算时失败！", ref PrenoList);
            }
            return 0;
        }

        public int InHosAdvance(int TranType, int InHosState, string PersonID, int CurrentInHosMark, System.Data.DataSet inHosRecordData, System.Data.DataSet advanceRecordData, ref System.Collections.ArrayList PrenoList)
        {
            throw new NotImplementedException();
        }

        public int InHosChangeOffice(int TranType, int InHosState, string PersonID, int CurrentInHosMark, System.Data.DataSet inHosRecordData, System.Data.DataSet changeBedData, ref System.Collections.ArrayList PrenoList)
        {
            throw new NotImplementedException();
        }


        public int InHosBalance(int TranType, int InHosState, string PersonID, string InHosID, int CurrentInHosMark, System.Data.DataSet inHosRecordData, ref System.Collections.ArrayList PrenoList)
        {

            string inhosFlowNo = GetInhosRegInfo(InHosID)["INHOSFLOWNO"].ToString();
            string medType = "21";//医疗类别 2010*05-22  liujian added
            FrmSelectType selectType = new FrmSelectType();
            if (DialogResult.OK == selectType.ShowDialog())
            {
                medType = selectType.MedType;
            }

            log.Info("执行结算类交易");
            #region 预结算

            if (TranType == 1)
            {
                #region 明细上传

                DataSet ds = rationInhosRegFacade.FindByInHosID(InHosID);
                if (ds.Tables[0].Rows.Count > 0)
                {
                    if (!ds.Tables[0].Rows[0]["MEDTYPE"].ToString().Trim().Substring(0, 1).Equals("1"))
                    {

                        DataSet inHosChargeDetail = chargeItemInfoFacade.BuildChargeInfoByInhosID(InHosID);
                        retint = InHosCharge(1, 1, "", InHosID, CurrentInHosMark, inHosRecordData, inHosChargeDetail, null, ref PrenoList);
                        if (retint != 0)
                        {
                            OutPutErrmsg("明细上传失败,结算失败", ref PrenoList);
                            return -1;
                        }

                        //string updownTime = ds.Tables[0].Rows[0]["MEDTYPE"].ToString();
                        //ds.Tables[0].Rows[0].BeginEdit();
                        //ds.Tables[0].Rows[0]["MEDTYPE"] = "1" + Convert.ToInt32(updownTime.Substring(1)).ToString();  //修改明细上传标志为1 已上传
                        //ds.Tables[0].Rows[0].EndEdit();


                        //rationInhosRegFacade.updateEntity(ds);
                    }
                }
                else
                {
                    OutPutErrmsg("找不到该医保病人的入院信息，进行结算时失败！", ref PrenoList);
                }

                #endregion


                string uploadTime = ds.Tables[0].Rows[0]["MEDTYPE"].ToString().Substring(1);//上传的次数

                string jbmc = string.Empty;
                string jbbm = string.Empty;
                string accountpay = string.Empty;
                string reasonLeaveHos = string.Empty;

                jbmc = PrenoList[0].ToString();
                jbbm = PrenoList[1].ToString();
                accountpay = PrenoList[2].ToString();
                reasonLeaveHos = PrenoList[3].ToString();

                if (jbbm.Equals(string.Empty) || jbmc.Equals(string.Empty) || accountpay.Equals(string.Empty) || reasonLeaveHos.Equals(string.Empty))
                {
                    MessageBox.Show("请更新该病人的结算信息，然后进行结算！");
                    return -1;
                }

                InitPara();
                ybpara.BusinessCode = "2420";//结算交易码
                ybpara.SenderSerialNo = FormateSenderSerialNo();//获得交易流水号

                #region 预结算的输入参数
                /*
				 * 编号	说明	类型	约束	备注
					14		住院流水号(门诊流水号)	VARCHAR2(18)	NOT NULL	同登记时的住院流水号（门诊流水号）
					15		单据号	VARCHAR2(18)	NOT NULL	唯一
					16		医疗类别	VARCHAR2(3)	NOT NULL	医疗类别
					17		结算日期	VARCHAR2(14)	NOT NULL	YYYYMMDDHH24MISS，医院上传数据不能为空
					18		出院日期	VARCHAR2(14)		YYYYMMDDHH24MISS，医院上传数据不能为空
					19		出院原因	VARCHAR2(3)		'0'_正常治愈出院         
					'1'_未治愈出院           
					'2'_医院要求转院         
					'3'_病人要求转院         
					'4'_院内相关疾病转科治疗 
					'5'_院内无关疾病专科治疗 
					'6'_死亡                 
					20		出院诊断疾病编码	VARCHAR2(20)		必须为中心病种编码
					21		出院诊断疾病名称	VARCHAR2(50)		
					22		报销类别	VARCHAR2(3)	NOT NULL	定点医疗机构全部传“0”
					23		账户使用标志	VARCHAR2(3)	NOT NULL	0帐户不支付,1账户支付
					24		中途结算标志	VARCHAR2(3)		0_非中途结算 1：中途结算
					25		经办人	VARCHAR2(20)	NOT NULL	医疗机构操作员姓名
					26		是否保存处方标志	VARCHAR2(3)		Null
                    14	备用01	VARCHAR2(3)		
                    15	备用02	VARCHAR2(10)		
                    16	备用03	VARCHAR2(10)		
                    17	备用04	VARCHAR2(10)		
                    18	备用05	VARCHAR2(10)		

				 * */
                StringBuilder sb = new StringBuilder(1024);
                sb.Append(inhosFlowNo);//住院流水号
                sb.Append("|");
                sb.Append(inhosFlowNo + uploadTime);//单据号
                sb.Append("|");
                sb.Append(medType);//医疗类别
                sb.Append("|");
                sb.Append(serverTime.ToString("yyyyMMddHHmmss"));
                sb.Append("|");
                sb.Append(serverTime.ToString("yyyyMMddHHmmss"));//出院日期
                sb.Append("|");
                sb.Append(reasonLeaveHos);//出院原因
                sb.Append("|");
                sb.Append(jbbm);//出院诊断疾病编码
                sb.Append("|");
                sb.Append(jbmc);//出院诊断疾病名称
                sb.Append("|");
                sb.Append("0");//报销类别
                sb.Append("|");
                sb.Append(accountpay);//账户使用标志
                sb.Append("|");
                sb.Append("0");//中途结算标志
                sb.Append("|");
                sb.Append(operatorName);//经办人
                sb.Append("|");
                sb.Append("");//是否保存处方标志
                sb.Append("|");
                sb.Append("");
                sb.Append("|");
                sb.Append("");
                sb.Append("|");
                sb.Append("");
                sb.Append("|");
                sb.Append("");
                sb.Append("|");
                sb.Append("");
                sb.Append("|");

                #endregion
                ybpara.InputInnerStr = sb;
                ybpara.InputStr = FormateInputString();
                log.Info("预结算生成的输入参数为：" + ybpara.InputStr);
                retint = YbFun.BUSINESS_HANDLE(ybpara.InputStr, ybpara.OutputStr);
                log.Info("预结算生成的输出参数为：" + ybpara.OutputStr);
                if (retint != 0)
                {
                    errmsg = "医保接口预结算失败,详细信息：" + ybpara.OutputStr.ToString();
                    log.Info(errmsg);
                    MessageBox.Show(errmsg);
                    return -1;
                }
                log.Info("医保预结算成功");

                PrenoList.Clear();
                PrenoList.Add(ybpara.OutputStr.ToString().Split('^')[2]);


            }
            #endregion

            #region 正式结算
            if (TranType == 3)
            {

                #region 明细上传

                DataSet ds = rationInhosRegFacade.FindByInHosID(InHosID);
                if (ds.Tables[0].Rows.Count > 0)
                {
                    if (!ds.Tables[0].Rows[0]["MEDTYPE"].ToString().Trim().Substring(0, 1).Equals("1"))
                    {
                        DataSet inHosChargeDetail = chargeItemInfoFacade.BuildChargeInfoByInhosID(InHosID);
                        retint = InHosCharge(1, 1, "", InHosID, CurrentInHosMark, inHosRecordData, inHosChargeDetail, null, ref PrenoList);
                        if (retint != 0)
                        {
                            OutPutErrmsg("明细上传失败,结算失败", ref PrenoList);
                            return -1;
                        }
                        //string updownTime = ds.Tables[0].Rows[0]["MEDTYPE"].ToString();
                        //ds.Tables[0].Rows[0].BeginEdit();
                        //ds.Tables[0].Rows[0]["MEDTYPE"] = "1" + Convert.ToInt32(updownTime.Substring(1)).ToString();  //修改明细上传标志为1 已上传
                        //ds.Tables[0].Rows[0].EndEdit();


                        //rationInhosRegFacade.updateEntity(ds);
                    }
                }
                else
                {
                    OutPutErrmsg("找不到该医保病人的入院信息，进行结算时失败！", ref PrenoList);
                }

                #endregion

                string uploadTime = ds.Tables[0].Rows[0]["MEDTYPE"].ToString().Substring(1);//上传的次数
                string flag = ds.Tables[0].Rows[0]["FLAG"].ToString();
                if (flag.Equals("2"))
                {
                    MessageBox.Show("该病人已经进行过医保结算！如需重新结算，请使用出院召回功能！");
                    return -1;
                }
                string jbmc = string.Empty;
                string jbbm = string.Empty;
                string accountpay = string.Empty;
                string reasonLeaveHos = string.Empty;

                jbmc = PrenoList[0].ToString();
                jbbm = PrenoList[1].ToString();
                accountpay = PrenoList[2].ToString();
                reasonLeaveHos = PrenoList[3].ToString();

                //FrmSelectTradeTypeForRZ selectTradeType = new FrmSelectTradeTypeForRZ();
                //if (DialogResult.OK == selectTradeType.ShowDialog())
                //{
                //    jbmc = selectTradeType.bzmc;
                //    jbbm = selectTradeType.bzbm;
                //    accountpay = selectTradeType.accountPay;
                //    reasonLeaveHos = selectTradeType.reasonLeaveHos;

                //}
                //else
                //{
                //    MsgWarning("请更新该病人的结算信息，然后进行结算！");
                //    return -1;
                //}

                InitPara();
                ybpara.BusinessCode = "2410";//结算交易码
                ybpara.SenderSerialNo = FormateSenderSerialNo();//获得交易流水号
                string senderserialno = ybpara.SenderSerialNo;//保存交易流水号，用于结算冲正；

                #region 正式结算的输入参数
                /*
				 * 编号	说明	类型	约束	备注
					14		住院流水号(门诊流水号)	VARCHAR2(18)	NOT NULL	同登记时的住院流水号（门诊流水号）
					15		单据号	VARCHAR2(18)	NOT NULL	唯一
					16		医疗类别	VARCHAR2(3)	NOT NULL	医疗类别
					17		结算日期	VARCHAR2(14)	NOT NULL	YYYYMMDDHH24MISS，医院上传数据不能为空
					18		出院日期	VARCHAR2(14)		YYYYMMDDHH24MISS，医院上传数据不能为空
					19		出院原因	VARCHAR2(3)		'0'_正常治愈出院         
					'1'_未治愈出院           
					'2'_医院要求转院         
					'3'_病人要求转院         
					'4'_院内相关疾病转科治疗 
					'5'_院内无关疾病专科治疗 
					'6'_死亡                 
					20		出院诊断疾病编码	VARCHAR2(20)		必须为中心病种编码
					21		出院诊断疾病名称	VARCHAR2(50)		
					22		报销类别	VARCHAR2(3)	NOT NULL	定点医疗机构全部传“0”
					23		账户使用标志	VARCHAR2(3)	NOT NULL	0帐户不支付,1账户支付
					24		中途结算标志	VARCHAR2(3)		0_非中途结算 1：中途结算
					25		经办人	VARCHAR2(20)	NOT NULL	医疗机构操作员姓名
					26		是否保存处方标志	VARCHAR2(3)		Null
                    14	备用01	VARCHAR2(3)		
                    15	备用02	VARCHAR2(10)		
                    16	备用03	VARCHAR2(10)		
                    17	备用04	VARCHAR2(10)		
                    18	备用05	VARCHAR2(10)		

				 * */
                StringBuilder sb = new StringBuilder(1024);
                sb.Append(inhosFlowNo);//住院流水号
                sb.Append("|");
                sb.Append(inhosFlowNo + uploadTime);//单据号
                sb.Append("|");
                sb.Append(medType);//医疗类别
                sb.Append("|");
                sb.Append(serverTime.ToString("yyyyMMddHHmmss"));
                sb.Append("|");
                sb.Append(serverTime.ToString("yyyyMMddHHmmss"));//出院日期
                sb.Append("|");
                sb.Append(reasonLeaveHos);//出院原因
                sb.Append("|");
                sb.Append(jbbm);//出院诊断疾病编码
                sb.Append("|");
                sb.Append(jbmc);//出院诊断疾病名称
                sb.Append("|");
                sb.Append("0");//报销类别
                sb.Append("|");
                sb.Append(accountpay);//账户使用标志
                sb.Append("|");
                sb.Append("0");//中途结算标志
                sb.Append("|");
                sb.Append(operatorName);//经办人
                sb.Append("|");
                sb.Append("");//是否保存处方标志
                sb.Append("|");
                sb.Append("");
                sb.Append("|");
                sb.Append("");
                sb.Append("|");
                sb.Append("");
                sb.Append("|");
                sb.Append("");
                sb.Append("|");
                sb.Append("");
                sb.Append("|");

                #endregion
                ybpara.InputInnerStr = sb;
                ybpara.InputStr = FormateInputString();
                log.Info("正式结算生成的输入参数为：" + ybpara.InputStr);
                retint = YbFun.BUSINESS_HANDLE(ybpara.InputStr, ybpara.OutputStr);
                log.Info("正式结算生成的输出参数为：" + ybpara.OutputStr);
                if (retint != 0)
                {
                    errmsg = "医保接口正式结算失败,详细信息：" + ybpara.OutputStr.ToString();
                    log.Info(errmsg);
                    MessageBox.Show(errmsg);
                    PrenoList.Clear();
                    PrenoList.Add(errmsg);
                    return -1;
                }
                log.Info("医保预结算成功");

                //20090116105411-62010037-5474^62010037-00000000-200901161051045466^0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|436|0|0|0|436|0|0|174.6|0|0|242|19.4|174.6|0|0|0|371121|174.6|0|0|0|174.6|0|0|0|0|19.4|0|0|0|0|0|0|0|城镇居民基本医疗||||0|0|174.6|436|242|19.4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|174.6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|21||^
                string[] outputString = ybpara.OutputStr.ToString().Split('^')[2].Split('|');


                #region 进行划卡操作 2011.02.14

               // PosChantEnity entity = new PosChantEnity();
                //entity.MerchanCode = "01";
                //entity.MerchanMoney = "0";
                //entity.POSFlowNo = DateTime.Now.ToString("MMddss");
                //entity.CashMemberNo = "";
                //entity.CashRegNo = "";
                //entity.OrginTerminalNo = "";
                //entity.AuthorizationNo = "";
                //entity.OrginTranDT = "";
                //entity.TerminalType = "7";
                //entity.Track1 = "";
                //entity.Track2 = "5226085710076865=49121200352600812761";
                //entity.Track3 = "996226095710076865=1561560500050000001015812761214000049120=5710076865=000000000=00000000571000000000000";

               
                //PosChantOutputEntity entOut= CandTrans(entity);

                //if (!entOut.Success)
                //{
                //    //执行结算回滚撤销 4.3.2.14	结算信息冲正
                //    InitPara();
                //    ybpara.BusinessCode = "4300";//门诊住院登记交易码
                //    ybpara.SenderSerialNo = FormateSenderSerialNo();//获得交易流水号

                //    #region 结算撤销的输入参数
                //    /*
                //    1	原发送方交易流水号	VARCHAR2(18)		
                //    2	操作员	VARCHAR2(10)		
                //    3	是否保存处方	VARCHAR2(3)	*/
                //    StringBuilder sc = new StringBuilder(1024);
                //    sc.Append(senderserialno);//结算交易的流水号
                //    sc.Append("|");
                //    sc.Append(ybpara.OPTRCode);//操作员号
                //    sc.Append("|");
                //    sc.Append("1");//是否保存处方 1 保存 0 不保存
                //    sc.Append("|");
                //    //log.Info("结算冲正的输入参数" + sc.ToString());
                //    #endregion
                //    ybpara.InputInnerStr = sc;
                //    ybpara.InputStr = FormateInputString();
                //    log.Info("结算冲正输入参数为：" + ybpara.InputStr.ToString());
                //    int i = YbFun.BUSINESS_HANDLE(ybpara.InputStr, ybpara.OutputStr);
                //    log.Info("结算冲正输出参数为：" + ybpara.OutputStr.ToString());
                //    return i;


                //}

                #endregion

                #region 保存结算数据
                //保存结算到结算信息表(I_BALANCE_RECORD):
                log.Info("保存结算数据开始");

                try
                {

                    #region 修改H_BALANCE_RECORD中的统筹，个人自付等费用
                    //增加代码处  五莲人民医院
                    ds.Tables[0].Rows[0].BeginEdit();
                    ds.Tables[0].Rows[0]["FLAG"] = "2";//已结算
                    ds.Tables[0].Rows[0]["TRANDT"] = serverTime;//增加结算时间
                    ds.Tables[0].Rows[0]["PRE0"] = outputString[15];
                    ds.Tables[0].Rows[0]["PRE1"] = outputString[16];
                    ds.Tables[0].Rows[0]["PRE2"] = outputString[17];
                    ds.Tables[0].Rows[0]["PRE3"] = outputString[18];
                    ds.Tables[0].Rows[0]["PRE4"] = outputString[19];
                    ds.Tables[0].Rows[0]["PRE5"] = outputString[20];

                    ds.Tables[0].Rows[0]["PRE6"] = outputString[25];
                    ds.Tables[0].Rows[0]["PRE7"] = outputString[28];
                    ds.Tables[0].Rows[0]["PRE8"] = outputString[29];
                    ds.Tables[0].Rows[0]["PRE9"] = outputString[30];

                    ds.Tables[0].Rows[0]["PRE10"] = outputString[27];//应付起伏标准

                    //改用银行卡时保存的字段
                    ds.Tables[0].Rows[0]["OUTPUTSTR"] = ybpara.OutputStr.ToString().Split('^')[2];
                    ds.Tables[0].Rows[0]["MEDCLASS"] = medType;//登记的医疗类别

                    //ds.Tables[0].Rows[0]["POSDATE"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    //ds.Tables[0].Rows[0]["POSMONEY"] = entOut.MerchanMoney;
                    //ds.Tables[0].Rows[0]["CASHMONEY"] = outputString[19];
                    //ds.Tables[0].Rows[0]["POSFLOWNO"] = entOut.POSFlowNo;

               
                    ds.Tables[0].Rows[0].EndEdit();
                    rationInhosRegFacade.updateEntity(ds);

                    #endregion
                }
                catch (Exception e)
                {
                    //插入结算表失败
                    this.errmsg = "HIS保存结算数据失败,详细信息：" + e.Message;
                    OutPutErrmsg(errmsg, ref PrenoList);
                    return -1;
                }

                log.Info("保存结算数据成功！");
                #endregion

                PrenoList.Clear();
                PrenoList.Add(ybpara.OutputStr.ToString().Split('^')[2]);

            }
            #endregion


            #region 正式结算取消
            if (TranType == -2)
            {
                DataSet ds = rationInhosRegFacade.FindByInHosID(InHosID);
                string uploadTime = ds.Tables[0].Rows[0]["MEDTYPE"].ToString().Substring(1);//上传的次数
                log.Info("正式结算取消开始");
                retint = TradCancel(inhosFlowNo, inhosFlowNo + uploadTime, operatorName, medType);
                if (retint != 0)
                {
                    errmsg = "医保数据结算取消失败";
                    OutPutErrmsg(errmsg, ref PrenoList);
                    return -1;
                }
                log.Info("正式结算取消完成！");
                if (ds.Tables[0].Rows.Count > 0)
                {
                    ds.Tables[0].Rows[0].BeginEdit();
                    ds.Tables[0].Rows[0]["FLAG"] = "0";
                    ds.Tables[0].Rows[0]["MEDTYPE"] = "0" + (Convert.ToInt32(uploadTime) + 1).ToString();//出院召回标志。 目的是处方再次上传区别，将处方号加一位数字2
                    ds.Tables[0].Rows[0].EndEdit();
                    rationInhosRegFacade.updateEntity(ds);

                }
                log.Info("结算取消交易完成");
            }
            #endregion

            return 0;
        }


        /// <summary>
        /// 结算撤销
        /// </summary>
        /// <param name="inhosFlowNo"></param>
        /// <param name="balanceID"></param>
        /// <returns></returns>
        private int TradCancel(string inhosFlowNo, string balanceID, string operatorName, string medicareType)
        {
            InitPara();
            ybpara.BusinessCode = "2430";//门诊住院登记交易码
            ybpara.SenderSerialNo = FormateSenderSerialNo();//获得交易流水号

            #region 结算撤销的输入参数
            /*
				* 编号	说明							类型					约束			备注
					1	住院流水号(门诊流水号)	VARCHAR2(18)	NOT NULL	同登记时的住院流水号（门诊流水号）
					2	单据号	VARCHAR2(18)	NOT NULL	唯一
					3	医疗类别	VARCHAR2(3)	NOT NULL	医疗类别
					4	结算日期	VARCHAR2(14)		null
					5	出院日期	VARCHAR2(14)		null
					6	出院原因	VARCHAR2(3)		null                 
					7	出院诊断疾病编码	VARCHAR2(20)		null
					8	出院诊断疾病名称	VARCHAR2(50)		
					9	报销类别	VARCHAR2(3)		定点医疗机构全部传“0”
					10	账户使用标志	VARCHAR2(3)		null
					11	中途结算标志	VARCHAR2(3)		null
					12	经办人	VARCHAR2(20)	NOT NULL	医疗机构操作员姓名
					13	是否保存处方标志	VARCHAR2(3)		0不保存1保存,默认不保存，若不保存处方，则撤销费用后，必须重新上传处方后才能结算
                    14	备用01	VARCHAR2(3)		
                    15	备用02	VARCHAR2(10)		
                    16	备用03	VARCHAR2(10)		
                    17	备用04	VARCHAR2(10)		
                    18	备用05	VARCHAR2(10)		


			 * */
            StringBuilder sc = new StringBuilder(1024);
            sc.Append(inhosFlowNo);//从his表中结算数据表中查询已经结算过的处方，再通过该处方获得上次结算时的门诊流水号
            sc.Append("|");
            sc.Append(balanceID);//单据号
            sc.Append("|");
            sc.Append(medicareType);//医疗类别  11普通门诊
            sc.Append("|");
            sc.Append(serverTime.ToString("yyyyMMddHHmmss"));//结算日期
            sc.Append("|");
            sc.Append("");//出院日期
            sc.Append("|");
            sc.Append("");//出院原因
            sc.Append("|");
            sc.Append("");//出院诊断疾病编码
            sc.Append("|");
            sc.Append("");//出院诊断疾病名称
            sc.Append("|");
            sc.Append("0");//报销类别
            sc.Append("|");
            sc.Append("0");//账户使用标志
            sc.Append("|");
            sc.Append("0");//中途结算标志
            sc.Append("|");
            sc.Append(operatorName);//登录操作员即为退费操作员
            sc.Append("|");
            sc.Append("0");//处方保留标志  若退费了不能再结算。
            sc.Append("|");
            sc.Append("");//备用1
            sc.Append("|");
            sc.Append("");//备用2
            sc.Append("|");
            sc.Append("");//备用3
            sc.Append("|");
            sc.Append("");//备用4
            sc.Append("|");
            sc.Append("");//备用5
            sc.Append("|");
            log.Info("退费函数所出入的内置参数为" + sc.ToString());
            #endregion
            ybpara.InputInnerStr = sc;
            ybpara.InputStr = FormateInputString();
            log.Info("取消结算输入参数为：" + ybpara.InputStr.ToString());
            int i = YbFun.BUSINESS_HANDLE(ybpara.InputStr, ybpara.OutputStr);
            log.Info("取消结算输出参数为：" + ybpara.OutputStr.ToString());
            return i;


        }
        /// <summary>
        /// 登记撤销
        /// </summary>
        /// <param name="transFlowNO"></param>
        /// <param name="operatorName"></param>
        /// <returns></returns>
        private bool RegisterCancel(string transFlowNO, string operatorName)
        {
            InitPara();
            ybpara.BusinessCode = "2240";//登记撤销
            ybpara.SenderSerialNo = FormateSenderSerialNo();//获得交易流水号

            #region 登记的函数的输入参数
            ybpara.InputInnerStr.Append(transFlowNO);//门诊交易流水号
            ybpara.InputInnerStr.Append("|");
            ybpara.InputInnerStr.Append(operatorName);
            ybpara.InputInnerStr.Append("|");

            #endregion
            ybpara.InputStr = FormateInputString();
            log.Info("登记取消时的传入的参数：" + ybpara.InputStr.ToString());
            retint = YbFun.BUSINESS_HANDLE(ybpara.InputStr, ybpara.OutputStr);
            log.Info("登记取消时的输出的参数：" + ybpara.OutputStr.ToString());
            if (retint < 0)
            {
                errmsg = "执行登记取消时遇到问题，请联系医保中心进行操作。原因：" + ybpara.OutputStr.ToString();
                return false;
            }
            log.Info("执行登记取消成功！");
            return true;
        }

        //处方退方
        private bool DiagenoseCancel(string registFlowNo, ArrayList list, string operatorName)
        {

            if (list.Count > 0)
            {
                StringBuilder inputstr = new StringBuilder(1024);
                inputstr.Append(registFlowNo + "||" + operatorName + "|");
                //2320^13002002^1057^13002002-00001057-200812261310480852^20081226131027-13002002-0001^0000^|0||^1^
                InitPara();//初始化医保内置函数的变量
                ybpara.BusinessCode = "2320";//费用明细上报
                ybpara.SenderSerialNo = FormateSenderSerialNo();//获得交易流水号

                ybpara.InputInnerStr = inputstr;
                ybpara.InputStr = FormateInputString();
                log.Info("执行" + list[0].ToString() + "明细退方生成的输入参数" + ybpara.InputStr);
                //执行上传明细
                retint = YbFun.BUSINESS_HANDLE(ybpara.InputStr, ybpara.OutputStr);
                if (retint != 0)
                {
                    errmsg = "执行" + list[0].ToString() + "明细退方失败！";
                    log.Info(errmsg);
                    MessageBox.Show(errmsg);
                    return false;
                }
                //list.Add(OutputStr.ToString().Split('^')[0]);//list中保存每次项目上传返回的交易流水号 以供处方上传失败时撤销已经成功上传的处方。
                log.Info("执行明细" + list[0].ToString() + "退方成功！");
            }
            return true;
        }


        public int ChangeInvoice(int TranType, int InHosState, string PersonID, int CurrentInHosMark, System.Data.DataSet inHosRecordData, ref System.Collections.ArrayList PrenoList)
        {
            throw new NotImplementedException();
        }

        public int HisRollBack(int ClinicType, int TranType, string PersonID, int CurrentInHosMark, ref System.Collections.ArrayList PrenoList)
        {
            throw new NotImplementedException();
        }

        public int HosTransformFeeType(int TranType, int InHosState, string PersonID, int CurrentInHosMark, ref System.Collections.ArrayList PrenoList)
        {
            throw new NotImplementedException();
        }

        public bool Init
        {
            get { throw new NotImplementedException(); }
        }

        public int PatientType
        {
            get { throw new NotImplementedException(); }
        }

        public int DownLoadDataFromMedicare(System.Collections.ArrayList PrenoList)
        {
            string itemId = PrenoList[0].ToString();
            DateTime beginTime = Convert.ToDateTime(PrenoList[1]);
            StringBuilder stb = new StringBuilder(2048);
            StringBuilder output = new StringBuilder(1024);
            stb.Append("1300^62010037^215^^");
            stb.Append("20081223151632-13002002-0001");//生成交易流水号
            // stb.Append("^0000^"+itemId+"|"+serverTime.ToString("yyyyMMddHHmmss")+"|^1^");
            stb.Append("^0000^" + itemId + "|" + beginTime.ToString("yyyyMMddHHmmss") + "|^1^");
            log.Info("生成的输入参数为" + stb.ToString());
            retint = YbFun.BUSINESS_HANDLE(stb, output);
            if (retint != 0)
            {
                errmsg = "批量查询失败,详细信息:" + output.ToString();
                MessageBox.Show(errmsg);
                return -1;
            }
            return 0;
        }



        public int UploadCorrectData(DataSet medicareInfo, int tranType)
        {
            /*
            编号	说明	类型	约束	备注
           1	中心项目编码	VARCHAR2(20)	NOT NULL	
           2	中心项目名称	VARCHAR2(14)	NOT NULL	
           3	中心收费类别	VARCHAR2(2)	NOT NULL	
           4	中心项目类别	VARCHAR2(2)	NOT NULL	1．	药品
           2．	诊疗
           3．	服务设施
           5	定点医疗机构项目编码	VARCHAR2(20)	NOT NULL	
           6	定点医疗机构项目名称	VARCHAR2(100)	NOT NULL	
           7	定点医疗机构项目剂型	VARCHAR2(20)		药品
           8	定点医疗机构项目单位	VARCHAR2(10)		
           9	定点医疗机构项目规格	VARCHAR2(100)		
           10	定点医疗机构项目价格	VARCHAR2(12)		2位小数

            */

            if (tranType == 0)
            {



                foreach (DataRow row in medicareInfo.Tables[0].Rows)
                {
                    StringBuilder stb = new StringBuilder(2048);
                    StringBuilder output = new StringBuilder(1024);
                    StringBuilder s = new StringBuilder();
                    s.Append(row["医保编码"].ToString());
                    s.Append("|");
                    s.Append(row["中心名称"].ToString());
                    s.Append("|");
                    s.Append(row["收费类别"].ToString());
                    s.Append("|");
                    s.Append(row["中心项目类别"].ToString());
                    s.Append("|");
                    s.Append(row["医院编码"].ToString());
                    s.Append("|");
                    s.Append(row["医院名称"].ToString());
                    s.Append("|");
                    s.Append(row["剂型"].ToString());
                    s.Append("|");
                    s.Append(row["单位"].ToString());
                    s.Append("|");
                    s.Append(row["规格"].ToString());
                    s.Append("|");
                    s.Append(row["价格"].ToString());
                    s.Append("|");

                    stb.Append("3450^62010037^215^" + businessSerialNo + "^");
                    stb.Append(FormateSenderSerialNo());//生成交易流水号
                    stb.Append("^0000^" + s + "^1^");
                    log.Info("生成的输入参数为" + stb.ToString());
                    retint = YbFun.BUSINESS_HANDLE(stb, output);
                    log.Info("输出的参数为:" + output.ToString());
                    if (retint != 0)
                    {
                        errmsg = "批量上传失败,详细信息:" + output.ToString();
                        MessageBox.Show(errmsg);
                        return -1;
                    }



                }
            }

            if (tranType == 1)
            {
                foreach (DataRow row in medicareInfo.Tables[0].Rows)
                {
                    StringBuilder stb = new StringBuilder(2048);
                    StringBuilder output = new StringBuilder(1024);
                    StringBuilder s = new StringBuilder();

                    s.Append(row["医院编码"].ToString());
                    s.Append("|");
                    s.Append(row["医院名称"].ToString());
                    s.Append("|");

                    stb.Append("3460^62010037^215^" + businessSerialNo + "^");
                    stb.Append(FormateSenderSerialNo());//生成交易流水号
                    stb.Append("^0000^" + s + "^1^");
                    log.Info("生成的输入参数为" + stb.ToString());
                    retint = YbFun.BUSINESS_HANDLE(stb, output);
                    log.Info("输出的参数为:" + output.ToString());
                    if (retint != 0)
                    {
                        errmsg = "批量上传失败,详细信息:" + output.ToString();
                        MessageBox.Show(errmsg);
                        return -1;
                    }



                }
            }
            return 0;

        }



        #endregion

        #region 医保DLL定义的函数
        public class YbFun
        {
            /// <summary>
            /// 医保交易函数
            /// </summary>
            /// <param name="inputData"></param>
            /// <param name="outputData"></param>
            /// <returns></returns>
            [DllImport("SiInterface.dll", CallingConvention = CallingConvention.StdCall)]
            public static extern int BUSINESS_HANDLE(StringBuilder inputData, StringBuilder outputData);

            /// <summary>
            /// 初始化函数
            /// </summary>
            /// <returns></returns>
            [DllImport("SiInterface.dll", CallingConvention = CallingConvention.StdCall)]
            public static extern int INIT(StringBuilder pErrMsg);


            /// <summary>
            /// 医保银行卡函数
            /// </summary>
            /// <param name="inputData"></param>
            /// <param name="outputData"></param>
            /// <returns></returns>
            [DllImport("sbyl.dll", CallingConvention = CallingConvention.StdCall)]
            public static extern int CardTrans(StringBuilder inputData, StringBuilder outputData);



        }


        #endregion

        #region 内置类
        private class YbPara
        {
            public string BusinessCode;			    //业务编号(4位)

            public string HosCode;					//医院编号(4位)
            public string OPTRCode = "215";					//操作员编号(8位) 与中心一致--由base获得
            public string BusiCycle;				//业务周期号(最大34位)

            public string SenderSerialNo;			//医院交易流水号 时间14+医院编号8+流水号4
            public string CenterCode = "0000";				//医保中心编码(4位)

            public StringBuilder InputStr = new StringBuilder(2048);					//输入参数 以|分隔 多条记录以$分隔
            public StringBuilder InputInnerStr = new StringBuilder(2048);				//输入参数的各个函数的内参
            public StringBuilder OutputStr = new StringBuilder(2048);			//输出参数


        };
        #endregion

        #region 病人信息体

        public struct PersonInfo
        {
            public string medicareno;	//医保号                        [腾冲->个人编号] [兰州->个人编号1]
            public string cardno;     //卡号                            [腾冲->IC卡号]      [兰州 13]
            public string carddataid; //数据分区编号
            public string idcardno;   //个人身份证号                  [腾冲->身份证]      [兰州 3]
            public string name;       //姓名                          [腾冲]              [兰州 4]
            public string sex;		//性别	                        [腾冲]              [兰州 5]
            public string birthday;   //生日                          [腾冲]              [兰州 7]
            public string workunitno; //工作单位代码                  [腾冲]   [兰州 2]
            public string workunitname;   //工作单位名称              [腾冲]
            public string type;           //人员类型                                      [兰州 8]
            public double AccountBalance; //个账余额                  [腾冲]              [兰州 17]
            public string InMedicareRegNo;//医保就诊编号
            public string CenterMedicareNo;//医保分配的惟一就医流水号
            public string YBguahaolsh;	//医保中心挂号流水号
            public string YBguahaoDate;	//医保中心挂号日期
            public string YBguahaoTime;	//医保中心挂号时间
            public double guahaoMoney;	//挂号费用
            public string InHosID;        //住院号
            public int InhosTimes;     //住院次数                  [腾冲]              [兰州 20]
            public string SickCode;       //疾病编码                  
            public string SickName;       //疾病名称
            public string inputInHosID;   //手工输入住院号
            public string inputInVoiceID; //手工输入发票号
            public string inputMedicareID;//手工输入医保号
            public string trustperson;    //医疗照顾人员标志
            public string nation;         //民族                                          [兰州 6]
            public string officialtype;   //公务员类别                                    [兰州 10]
            public string status;        //人员状态 
            public string IcPwd;         //医保病人IC卡密码   //处理多发票时用户只输入一次密码
            public string EnterHosOfficeId;    //入院科室
            public string OutHosOfficeId;      //出院科室
            public DateTime EnterHosData;        //入院日期
            public DateTime OutHosData;          //出院日期
            public DateTime MakeData;            //操作日期


            //----------------------------------------------------------------------------

            public string workdate;	//参加工作日期
            public string retiredate; //离退日期
            public string salary;     //月工资   8位  
            public string annuity;    //一次性统筹支付 8位
            public string areacode;	//区域代号
            public string ICStatus;	//IC卡状态
            public string outcenter;	//投保人所属分中心
            //----------------------------------------------------------------------------

            //-------------------------云南昆明腾冲东软接口增加的参数-----------------------

            public string inhosState;   //住院状态
            public string accountDate;  //结转日期
            public string jrtclj;       //进入统筹累计
            public string mxbtczflj;    //慢性病统筹支付累计
            public string qfxzflj;      //起付线自付累计
            public string rylbbm;       //人员类别编码
            public string rylbmc;       //人员类别名称
            public string tcqh;         //统筹区号
            public string icOwerArea;   //IC卡所属区


            //-------------------------云南昆明腾冲东软接口增加的参数-----------------------



            //-------------------------甘肃兰州东软接口增加的参数---------------------------
            public string zyjszwdj;     //专业技术职务等级9
            public string dzgblb;       //地专干部类别11
            public string tszglb;       //特殊照顾类别12
            public string syqh;         //所属区号14
            public string tcjjzf;       //统筹基金支付15
            public string jzjzf;        //救助金支付16
            public string zcyyqfbzzf;   //转出医院起付标准支付
            public string zhzflj;       //帐户支付累计21
            public string zhzfnd;       //帐户支付年度
            public string xjzfjelj;     //现金支付金额累计23
            public string grzf;         //个人自负
            public string gwyzflj;      //公务员支付金额累计
            public string mzdblj;       //门诊大病累计
            public string mzmxbzflj;    //门诊慢性病支付累计
            public string tsrybzzflj;   //特殊人员补助支付累计28
            public string qt1;          //其他1
            public string qt2;          //其他2
            public string qt3;          //其他3
            public string yxq;          //有效期
            public string fkjgbh;       //发卡机构编号
            public string xgrq;         //修改日期
            public string skbz;         //锁卡标志
            public string bz1;          //备注1
            public string bz2;          //备注2
            public string grzyzt;       //个人在院状态
            public string yybm;         //医院编码
            public string cyrq;         //出院日期
            public string zyjbbm;       //住院疾病编码

            //-------------------------甘肃兰州东软接口增加的参数---------------------------
        }
        public int clearperson()
        {
            this.person.idcardno = "";
            this.person.carddataid = ""; //数据分区编号
            this.person.AccountBalance = 0;
            this.person.cardno = "";
            this.person.InMedicareRegNo = "";
            this.person.medicareno = "";
            this.person.name = "";
            this.person.sex = "";
            this.person.birthday = "";   //生日
            this.person.type = "";
            this.person.workunitname = "";
            this.person.workunitno = "";
            this.person.CenterMedicareNo = "";//医保分配的惟一就医流水号
            this.person.InHosID = "";
            this.person.InhosTimes = 0;     //住院次数
            this.person.SickCode = "";       //疾病编码 
            this.person.SickName = "";       //疾病名称 
            this.person.inputInHosID = "";   //手工输入住院号
            this.person.inputInVoiceID = ""; //手工输入发票号
            this.person.inputMedicareID = "";//手工输入医保号
            this.person.trustperson = "";    //医疗照顾人员标志
            this.person.nation = "";         //民族
            this.person.officialtype = "";   //公务员类别
            this.person.status = "";        //人员状态
            this.person.EnterHosOfficeId = "";//入院科室
            this.person.OutHosOfficeId = "";//出院科室
            this.person.ICStatus = "";		//IC卡状态
            this.person.outcenter = "";		//投保人所属分中心名称
            this.person.YBguahaolsh = "";		//医保中心挂号流水号
            this.person.YBguahaoDate = "";	//医保中心挂号日期
            this.person.YBguahaoTime = "";	//医保中心挂号时间
            this.person.guahaoMoney = 0;		//挂号费用

            //-------------------------云南昆明腾冲东软接口增加的参数-----------------------

            this.person.inhosState = string.Empty;   //住院状态
            this.person.accountDate = string.Empty;  //结转日期
            this.person.jrtclj = string.Empty;       //进入统筹累计
            this.person.mxbtczflj = string.Empty;    //慢性病统筹支付累计
            this.person.qfxzflj = string.Empty;      //起付线自付累计
            this.person.rylbbm = string.Empty;       //人员类别编码
            this.person.rylbmc = string.Empty;       //人员类别名称
            this.person.tcqh = string.Empty;         //统筹区号
            this.person.icOwerArea = string.Empty;   //IC卡所属区

            //-------------------------云南昆明腾冲东软接口增加的参数-----------------------

            //-------------------------甘肃兰州东软接口增加的参数---------------------------
            this.person.zyjszwdj = string.Empty;     //专业技术职务等级9
            this.person.dzgblb = string.Empty;       //地专干部类别11
            this.person.tszglb = string.Empty;       //特殊照顾类别12
            this.person.syqh = string.Empty;         //所属区号14
            this.person.tcjjzf = string.Empty;       //统筹基金支付15
            this.person.jzjzf = string.Empty;        //救助金支付16
            this.person.zcyyqfbzzf = string.Empty;   //转出医院起付标准支付
            this.person.zhzflj = string.Empty;       //帐户支付累计21
            this.person.zhzfnd = string.Empty;       //帐户支付年度
            this.person.xjzfjelj = string.Empty;     //现金支付金额累计23
            this.person.grzf = string.Empty;         //个人自负
            this.person.gwyzflj = string.Empty;      //公务员支付金额累计
            this.person.mzdblj = string.Empty;       //门诊大病累计
            this.person.mzmxbzflj = string.Empty;    //门诊慢性病支付累计
            this.person.tsrybzzflj = string.Empty;   //特殊人员补助支付累计28
            this.person.qt1 = string.Empty;          //其他1
            this.person.qt2 = string.Empty;          //其他2
            this.person.qt3 = string.Empty;          //其他3
            this.person.yxq = string.Empty;          //有效期
            this.person.fkjgbh = string.Empty;       //发卡机构编号
            this.person.xgrq = string.Empty;         //修改日期
            this.person.skbz = string.Empty;         //锁卡标志
            this.person.bz1 = string.Empty;          //备注1
            this.person.bz2 = string.Empty;          //备注2
            this.person.grzyzt = string.Empty;       //个人在院状态
            this.person.yybm = string.Empty;         //医院编码
            this.person.cyrq = string.Empty;         //出院日期
            this.person.zyjbbm = string.Empty;       //住院疾病编码

            //-------------------------甘肃兰州东软接口增加的参数---------------------------

            return 0;


        }

        #endregion

        private int retint = 0;//函数调用后的返回值
        private YbPara ybpara = new YbPara();

        private string flowNo = "0001";//交易流水号
        //private string medcareNO = "";//医保号
        private LogService log;//日志文件
        private DateTime serverTime = DateTime.Now;//当前时间
        private string operatorName = ToolUltity.LoginUser.USERNAME;//操作员姓名
        private string operatorID = ToolUltity.LoginUser.USERID;//操作员编号
        private string errmsg = string.Empty;//
        private string HospitalNo = "62010037";//医疗机构编号
        private PersonInfo person;
        private string businessSerialNo = string.Empty;//业务周期号
        private string formateSenderSerialNo = string.Empty;//交易流水号

        private IRalationInHosRegFacade rationInhosRegFacade;
        private MIItemRelationYPFacade miitemRelationYbFacade;
        private MIItemRelationZLFacade miitemRelationZLFacade;
        private YBYPInfoFacade ybYpMLFacade;
        private YBZLInfoFacade ybZLXMFacade;
        private ChargeItemInfoFacade chargeItemInfoFacade;
        #region 自定义方法
        /// <summary>
        /// 调用医保dll时的输入参数
        /// </summary>
        /// <returns></returns>
        private StringBuilder FormateInputString()
        {
            //入参格式为 业务编号^医疗机构编号^操作员编号^业务周期号^交易流水号^中心编码^交易函数的入参^动态库参数^
            log.Info("正在生成输入参数！");
            StringBuilder stb = new StringBuilder(2048);
            stb.Append(ybpara.BusinessCode);//业务编码
            stb.Append("^");
            stb.Append(ybpara.HosCode);//医疗机构编号
            stb.Append("^");
            stb.Append(ybpara.OPTRCode);//操作员编号
            stb.Append("^");
            stb.Append(ybpara.BusiCycle);//业务周期号
            stb.Append("^");
            stb.Append(ybpara.SenderSerialNo);//交易流水号
            stb.Append("^");
            stb.Append(ybpara.CenterCode);//中心编码
            stb.Append("^");
            stb.Append(ybpara.InputInnerStr);//交易函数的入参
            stb.Append("^");
            stb.Append("1");//联机标志
            stb.Append("^");
            //stb.Append(ybpara.ComputerMAC);//动态库参数
            //stb.Append("|");
            //if (ybpara.BusinessCode.Equals("9100"))
            //    stb.Append("50|");//签到交易时必须要加上医院用户的数目
            //stb.Append("^");
            //log.Info("生成输入参数为" + stb.ToString());
            return stb;


        }

        /// <summary>
        /// 初始化医保函数的变量
        /// </summary>
        public void InitPara()
        {
            //ybpara.BusiCycle = "";//做传入参数时业务周期号为空  
            ybpara.HosCode = HospitalNo;//由base获得  医院编号
            ybpara.OPTRCode = operatorID;//由base获得  操作员编号
            ybpara.BusiCycle = businessSerialNo;//由签到产生的业务周期号
            ybpara.OutputStr.Remove(0, ybpara.OutputStr.Length);//输出参数
            ybpara.InputStr.Remove(0, ybpara.InputStr.Length);//输入参数
            ybpara.InputInnerStr.Remove(0, ybpara.InputInnerStr.Length);//内置输入参数为空


        }
        //生成交易流水号
        public string FormateSenderSerialNo()
        {
            //规则：时间(14)+医院编号(8)+流水号(4)，之间用-分隔  4位流水号可以循环使用
            //例如：20060101083030-10011001-0001
            if (formateSenderSerialNo.Equals(string.Empty))
            {
                StringBuilder senderSerialNo = new StringBuilder();
                string date = serverTime.ToString("yyyyMMddHHmmss");
                senderSerialNo.Append(date);
                senderSerialNo.Append("-");
                senderSerialNo.Append(HospitalNo);
                senderSerialNo.Append("-");
                senderSerialNo.Append(flowNo);
                flowNo = Convert.ToString(Convert.ToInt32(flowNo) + 1).PadLeft(4, '0');
                if (flowNo.Equals("9999"))
                    flowNo = "0001";
                formateSenderSerialNo = senderSerialNo.ToString();
            }

            return formateSenderSerialNo;

        }

        //生成交易流水号
        public string FormateInhosSerialNo()
        {
            StringBuilder senderSerial = new StringBuilder();
            string date = serverTime.ToString("yyMMddHHmmss");
            senderSerial.Append(date);
            senderSerial.Append(flowNo);
            flowNo = Convert.ToString(Convert.ToInt32(flowNo) + 1).PadLeft(2, '0');
            if (flowNo.Equals("99"))
                flowNo = "01";
            return senderSerial.ToString();

        }

        //根据住院ID查找对应的住院流水号及医院交易流水号
        private DataRow GetInhosRegInfo(string inhosId)
        {
            DataSet ds = rationInhosRegFacade.FindByInHosID(inhosId);
            if (ds.Tables[0].Rows.Count <= 0)
            {
                return null;
            }
            return ds.Tables[0].Rows[0];
        }

        //获取药品项目对应的医保中心药品项目编码
        private DataRow GetCenterYp(string leechdomno)
        {
            DataSet ds = miitemRelationYbFacade.FindByPrimaryKey(leechdomno);
            if (ds.Tables[0].Rows.Count > 0)
            {
                return ds.Tables[0].Rows[0];
            }
            return null;
        }
        //获取诊疗项目对应的医保中心项目中心编码
        private DataRow GetCenteritem(string itemId)
        {
            DataSet ds = miitemRelationZLFacade.FindByPrimaryKey(itemId);
            if (ds.Tables[0].Rows.Count > 0)
            {
                return ds.Tables[0].Rows[0];
            }
            return null;
        }

        //获取药品医保对应的信息
        private DataRow GetYpByItem(string itemId)
        {
            DataSet ds = ybYpMLFacade.FindByPrimaryKey(itemId);
            if (ds.Tables[0].Rows.Count <= 0)
            {
                return null;
            }
            return ds.Tables[0].Rows[0];
        }
        //获取诊疗项目医保对应的信息
        private DataRow GetZLByItem(string itemId)
        {
            DataSet ds = ybZLXMFacade.FindByPrimaryKey(itemId);
            if (ds.Tables[0].Rows.Count <= 0)
            {
                return null;
            }
            return ds.Tables[0].Rows[0];
        }


        //获取操作员姓名
        private string GetOperatorName()
        {
            operatorName = "00";
            return operatorName;
        }

        //错误异常处理
        private void OutPutErrmsg(string err, ref System.Collections.ArrayList PrenoList)
        {
            log.Error(err);
            MessageBox.Show(err);
            PrenoList.Clear();
            PrenoList.Add(err);
        }

        private string GetOfficeName(string officeID)
        {
            return "";
        }


        //插入住院登记信息关系表
        private bool UpdateRalationData(DataSet ds, int state)//state 0增加 1删除
        {
            //IRalationInHosRegFacade rationInhosRegFacade=new IRalationInHosRegFacade();
            if (state == 0)
            {
                try
                {
                    rationInhosRegFacade.insertEntity(ds);
                    return true;
                }
                catch (Exception ex)
                {

                    throw new Exception(ex.Message, ex);

                }
            }
            if (state == 1)
            {
                try
                {
                    rationInhosRegFacade.deleteEntity(ds);
                    return true;
                }
                catch (Exception ex)
                {

                    throw new Exception(ex.Message, ex);

                }
            }
            return false;

        }


        #endregion


        #region 医保银行卡相关函数

        #region 格式化数据

        /// <summary>
        /// 格式化输入POS数据
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        private StringBuilder FormateInputString(PosChantEnity entity)
        {
            //入参格式为 业务编号^医疗机构编号^操作员编号^业务周期号^交易流水号^中心编码^交易函数的入参^动态库参数^

            StringBuilder stb = new StringBuilder(2048);
            stb.Append(entity.MerchanCode.Length > 2 ? entity.MerchanCode.Substring(0, 2) : entity.MerchanCode.PadLeft(2, ' '));//交易代码
            stb.Append(entity.MerchanMoney.Length > 12 ? entity.MerchanCode.Substring(0, 12) : entity.MerchanMoney.PadLeft(12, ' '));//交易金额

            stb.Append(entity.POSFlowNo.Length > 6 ? entity.POSFlowNo.Substring(0, 6) : entity.POSFlowNo.PadLeft(6, ' '));//操作员编号

            stb.Append(entity.CashRegNo.Length > 10 ? entity.CashRegNo.Substring(0, 10) : entity.CashRegNo.PadLeft(10, ' '));//收银机号

            stb.Append(entity.CashMemberNo.Length > 10 ? entity.CashMemberNo.Substring(0, 10) : entity.CashMemberNo.PadLeft(10, ' '));//交易流水号

            stb.Append(entity.OrginTerminalNo.Length > 15 ? entity.OrginTerminalNo.Substring(0, 15) : entity.OrginTerminalNo.PadLeft(15, ' '));//原终端号

            stb.Append(entity.AuthorizationNo.Length > 6 ? entity.AuthorizationNo.Substring(0, 6) : entity.AuthorizationNo.PadLeft(6, ' '));//授权号

            stb.Append(entity.OrginTranDT.Length > 8 ? entity.OrginTranDT.Substring(0, 8) : entity.OrginTranDT.PadLeft(8, ' '));
            stb.Append(entity.TerminalType.Length > 1 ? entity.TerminalType.Substring(0, 1) : entity.TerminalType.PadLeft(1, ' '));
            stb.Append(entity.Track1.Length > 76 ? entity.Track1.Substring(0, 76) : entity.Track1.PadLeft(76, ' '));
            stb.Append(entity.Track2.Length > 37 ? entity.Track2.Substring(0, 37) : entity.Track2.PadLeft(37, ' '));
            stb.Append(entity.Track3.Length > 104 ? entity.Track3.Substring(0, 104) : entity.Track3.PadLeft(104, ' '));

            //log.Info("生成输入参数为" + stb.ToString());
            return stb;


        }


        /// <summary>
        /// 格式化返回字符串为实体
        /// </summary>
        /// <param name="outputString"></param>
        /// <returns></returns>
        private PosChantOutputEntity FormateOutputString(StringBuilder outputString)
        {
            PosChantOutputEntity entity = new PosChantOutputEntity();
            string str = outputString.ToString();

            //000000                                交易成功000004               52260857100768650710  000000000004                      62103356    98888.99


            /*
             
              返回码	        1-6	        6	
            返回码含义	    7-46	    40	
            pos流水号	    43-52	    6	//好像是从43位开始的,注意测试
            授权号	        53-58	    6	
            批次号	        59-64	    6	
            卡号	        65-83	    19	
            有效期	        84-87	    4	
            银行号	        88-89	    2	
            银行检索参考号	90-101	    12	
            终端号	        102-116	    15	
            商户号	        117-131	    15	
            交易金额	    132-143	    12	

             */
            entity.ReturnCode = str.Substring(0, 6).Trim();
            if (str.Length < 128)
            {
                entity.Success = false;//执行结果失败
                return entity;

            }
            entity.Success = true;//执行结果成功
            entity.ReturnCodeMean = str.Substring(6, 36).Trim();
            entity.POSFlowNo = str.Substring(42, 6).Trim();
            entity.AuthorizationNo = str.Substring(48, 6).Trim();
            entity.BatchNo = str.Substring(54, 6).Trim();
            entity.CardNo = str.Substring(60, 19).Trim();
            entity.InvalidDate = str.Substring(79, 4).Trim();
            entity.BankNo = str.Substring(83, 2).Trim();
            entity.BankSearchNo = str.Substring(85, 12).Trim();
            entity.TerminalNo = str.Substring(97, 15).Trim();
            entity.FirmNo = str.Substring(112, 15).Trim();
            entity.MerchanMoney = str.Substring(127).Trim();


            return entity;
        }




        #endregion

        #region 银行卡消费函数
        /// <summary>
        /// 银行卡消费函数
        /// </summary>
        /// <param name="entity">交易传入实体</param>
        /// <returns>交易传出实体</returns>
        public PosChantOutputEntity CandTrans(PosChantEnity entity)
        {
            StringBuilder strOpt = new StringBuilder(1024);

            YbFun.CardTrans(FormateInputString(entity), strOpt);

            return FormateOutputString(strOpt);
        }

        /// <summary>
        /// 查询金额
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public string ShowBalance(PosChantEnity entity)
        {
            StringBuilder strOpt = new StringBuilder(1024);

            YbFun.CardTrans(FormateInputString(entity), strOpt);

            return FormateOutputString(strOpt).MerchanMoney;
        }

        #endregion

        #endregion





        

    }
}
